DEFINITION MODULE Formats; (* Sem  07-Aug-88. (c) KRONOS *)
                           (* Leo  03-Nov-88. (c) KRONOS *)
                           (* Hady 17-Aug-89. (c) KRONOS *)

(* Универсальный форматный вывод. *)

IMPORT  SYSTEM;

TYPE write_proc = PROCEDURE (
          SYSTEM.WORD,   -- определяет направление вывода
          ARRAY OF CHAR, -- выводимая строка
          INTEGER,       -- позиция в выводимой строке
          INTEGER        -- длина значимой части строки в байтах
                             );

PROCEDURE format(parameter: SYSTEM.WORD;   -- для write_proc
                 write    : write_proc;
                 format   : ARRAY OF CHAR;
             SEQ arguments: SYSTEM.WORD);
(* Выводит процедурой write аргументы в соответствии с форматом *)

(***************************************************************

  format     ::= { текст | "%" формат | "%%" | "\n"
                   | "\r" | "\l" | "\\" } 0c.
  текст      ::= "любая последовательность символов ASCII-8,
                  кроме '%','\' и 0c ".
                  Если требуется символ '%', предварите его '%':
                  '%%' преобразуется в просто '%'.
                  Если требуется символ '\', предварите его '\':
                  '\\' преобразуется в просто '\'.
  формат     ::= { модификатор } база.
  база       ::= ("d"|"h"|"b"|"s"|"{}"|"i").
  ширина     ::= цифра { цифра } | "*".
  точность   ::= "." цифра { цифра } | ".*" .
  модификатор::= ( space | "$" | "-" | "+" | "#" | "|" | ширина
                   | точность | нач.позиция ) .
  d   (Decimal)       - десятичное;
  h,H (Hexidecimal)   - шестнадцатеричное
                        (h,x -- "A".."F" прописные)
  x,X (Hexidecimal)   - эквивалентно 'h'
                        (H,X -- "a".."f"  строчные)
  b,B (Octal)         - восьмеричное;
  o,O (Octal)         - эквивалентно 'b'
  s,S (String)        - строка;
  c,C (Char  )        - одиночный символ
  {}  (set)           - битсет;
  i,I (bIn)           - двоичное;
  f,F (Float)         - вещественное число в формате:
                          [+|-]dddddddd.ddddd
                            |__  n1  __|_ t _|
                        Число  цифр  до  запятой n1 - минимально
                        необходимое   для  представления  числа.
                        Число  цифр  после  запятой t - задается
                        точностью (по умолчанию 6).
  e,E (Exponent)      - вещественное число в формате:
                          [+|-]d.ddddddE(+|-)dd    или
                          [+|-]D.DDDDDDe(+|-)DD
                        Число цифр до запятой 1
                        Число цифр после запятой t - задается
                        точностью (по умолчанию 6)
                        (формат 'e' -- 'E' в результате)
                        (формат 'E' -- 'e' в результате)
  g,G (General)       - вещественное число в формате:
                          если FLOAT(TRUNC(число))=число,
                          то в формате   dddddd;
                          иначе в формате 'f' или 'e'
                          - какой короче.
  #                   - показывает  число  с указанием основания
                        (например:   image(s,"%$10#h",12abcdefH);
                        эквивалентно image(s,"012ABCDEFh") );
  -                   - значение пишется слева в поле
                        установленной ширины;
  |                   - значение пишется в центре поля
                        установленной ширины;
  +                   - показывает  число  со знаком, независимо
                        от знака числа;
  $   (zero)          - дополнить до нужного количества разрядов
                        ведущими нулями;
  space               - выставляется     знак,     если    число
                        отрицательное, иначе пробел;
  точность            - задает   число  значащих  цифр  после(!)
                        запятой в форматах 'f' , 'e', 'g', число
                        символов строки в формате 's' или  число
                        повторений символа в формате "c";
  ширина              - задает  общую(!)  ширину  поля (с учетом
                        возможных  символов  основания,  знака и
                        т.п.);     если     указанной     ширины
                        недостаточно      для      представления
                        выводимого      значения,     происходит
                        автоматическое    расширение   поля   до
                        минимально   необходимого;  если  вместо
                        спецификации   ширины   и/или   точности
                        указаны   '*',   то  значения  ширины  и
                        точности   берутся   из  соответствующих
                        аргументов.  Внимание! Значение точности
                        и   ширины   должно  быть  из  диапазона
                        [0..255];   в   противном   случае   оно
                        принимается     равным    значению    по
                        умолчанию.
ПРИМЕЧАНИЯ:

   У   базы   "s"  может  быть  третий  числовой  модификатор,
   обозначающий  номер  позиции  в строке-аргументе, с которой
   эта  строка читается. Этот модификатор отделяется от
   предыдущих  символом "." и может быть как  прямо  указан  в
   строке   формата,   так  и  передаваться  как  аргумент;  в
   последнем   случае  вместо  числа  в  модификаторе  следует
   использовать символ "*". Первые числовые модификаторы
   могут быть опущены, но разделитель "." должен оставаться.
   Пример: %..10s означает вывод с 10 байта.


   Модификаторы  '$' и '-',   естественно, не совместимы.
   Модификаторы  '+' и space, естественно, не совместимы.
   Модификатор  точность  может быть использован только с базами
   's','f','e','g'.
   Модификаторы  '+'  и  space  могут быть использованы только с
   базами 'i','f','e','g'.
   Модификаторы  '$',  '+'  и space НЕ могут быть использованы с
   базами 's','{}','c'.
   \n  обозначает CR+LF
   \r  обозначает CR
   \l  обозначает LF
   \e  обозначает ESC
   \g  обозначает BEL
   \\  обозначает \
   ВНИМАНИЕ! \n, \r,... обрабатываются ТОЛЬКО в формате, но не в
   строках-аргументах!!!

***************************************************************)

END Formats.
